package com.aaron.remoting.transport.netty.client;

import com.aaron.remoting.dto.RpcResponse;

import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;

/**
 * unprocessed requests by the server.rpcRequest未处理的请求。
 * 这里就是做异步请求通知的，使用了CompletableFuture
 * 建议限制map容器大小，避免未处理请求过多被OOM
 */
public class UnprocessedRequests {
    // key：requestId， value:CompletableFuture
    private static final Map<String, CompletableFuture<RpcResponse<Object>>> UNPROCESSED_RESPONSE_FUTURES = new ConcurrentHashMap<>();

    public void put(String requestId, CompletableFuture<RpcResponse<Object>> future) {
        UNPROCESSED_RESPONSE_FUTURES.put(requestId, future);
    }

    // 完成了请求
    public void complete(RpcResponse<Object> rpcResponse) {
        // 未处理的map中删除此，表示已经完成
        CompletableFuture<RpcResponse<Object>> future = UNPROCESSED_RESPONSE_FUTURES.remove(rpcResponse.getRequestId());
        if (null != future) {
            // CompletableFuture中的complete()方法，就是在异步执行结果
            // CompletableFuture.get()等待CompletableFuture.complete()方法执行
            future.complete(rpcResponse);
        } else {
            throw new IllegalStateException();
        }
    }
}
